package com.xiaoyang.ssyx;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @AUTHOR XiaoYang
 * @DATE 2023/7/3-15:31
 * @DESCRIPTION TODO 串行化
 *                   thenApply方法：当一个线程依赖另一个线程时，获取上一个任务返回的结果，并返回当前任务的返回值。
 *                   thenAccept方法：消费处理结果。接收任务的处理结果，并消费处理，无返回结果。
 *                   thenRun方法：只要上面的任务执行完成，就开始执行thenRun,只是处理完任务后，执行thenRun的后续操作
 */
public class CompletableFutureDemo4 {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //创建线程池（实际中不这么做）
        ExecutorService executorService = Executors.newFixedThreadPool(3);

        System.out.println("main begin...");
        //1 任务1 返回结果 1024
        CompletableFuture<Integer> futureA = CompletableFuture.supplyAsync(()->{
            int value = 1024;
            System.out.println("任务1 :" + value);
            return value;
        },executorService);
        //2 任务2 获取任务1的返回结果 thenAcceptAsync的参数是上一个任务的返回值
        CompletableFuture<Integer> futureB = futureA.thenApplyAsync((res) -> {
            System.out.println("任务2 :" + res);
            return res;
        }, executorService);

        //3 任务3 直接往下执行
        CompletableFuture<Void> futureC = futureA.thenRunAsync(() -> {
            System.out.println("任务3...");
        }, executorService);

        System.out.println("main over...");

    }
}
